﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdmLaboratorios.DAO;
using AdmLaboratorios.DTO;
using System.Data.SqlClient;
using System.Data;

namespace AdmLaboratorios.Business
{
    public static class Productos
    {
        static ProductoDAO daoProductos = DAOFactory.Get<ProductoDAO>();
        static PartnerProductoDAO daoPartenerProducto = DAOFactory.Get<PartnerProductoDAO>();

        public static DataTable Get(PartnerDTO partner, bool filtraPorPartener, string filtro)
        {
            if (partner != null)
                return daoProductos.GetByPartner(partner.Id, filtraPorPartener, filtro);
            else
                return daoProductos.GetByPartner(0, filtraPorPartener, filtro);
        }

        public static DataTable GetTerminados(PartnerDTO partner, bool filtraPorPartener, string filtro)
        {
            if (partner != null)
                return daoProductos.GetByPartnerTerminados(partner.Id, filtraPorPartener, filtro);
            else
                return daoProductos.GetByPartnerTerminados(0, filtraPorPartener, filtro);
        }

        public static ProductoDTO Get(int id)
        {
            return daoProductos.Read(id);
        }

        public static void Modificar(ProductoDTO producto)
        {
            using (SqlTransaction tran = daoProductos.IniciarTransaccion())
            {
                daoProductos.Update(producto, producto.Id, tran);

                daoProductos.Log(LogDTO.eAcciones.Modificacion, "Modificación", producto.Id, tran);
                daoProductos.CommitTransaccion(tran);
            }
        }

        public static ProductoDTO Crear(ProductoDTO producto)
        {
            using (SqlTransaction tran = daoProductos.IniciarTransaccion())
            {
                producto = daoProductos.Create(producto, tran);

                daoProductos.Log(LogDTO.eAcciones.Alta, "Crear", producto.Id, tran, "Producto");
                daoProductos.CommitTransaccion(tran);

                return producto;
            }
        }

        public static DataTable Filtrados(string filtro)
        {
            return daoProductos.Consulta(filtro);
        }

        public static void Asignar(PartnerDTO partner, DataTable dt)
        {
            using (SqlTransaction tran = daoPartenerProducto.IniciarTransaccion())
            {
                PartnerProductoDTO pp;

                //Elimino las asignaciones existentes.
                daoPartenerProducto.Delete("IdPartner=" + partner.Id.ToString(), tran);
                daoPartenerProducto.Log(LogDTO.eAcciones.Baja, "Eliminacion de Asignación de Productos al Partner.", 0, tran, "PartnerProducto");

                foreach (DataRow dr in dt.Rows)
                {
                    pp = new PartnerProductoDTO();

                    pp.Id = 0;
                    pp.IdPartner = partner.Id;
                    pp.IdProducto = (int)dr["Id"];

                    pp = daoPartenerProducto.Create(pp, tran);
                    daoPartenerProducto.Log(LogDTO.eAcciones.Alta, "Asignación de Producto al Partner.", pp.Id, tran, "PartnerProducto");
                }
                
                daoPartenerProducto.CommitTransaccion(tran);
            }
        }

        public static bool Eliminar(int id)
        {
            try
            {
                using (SqlTransaction tran = daoProductos.IniciarTransaccion())
                {
                    daoProductos.Delete(id, tran);
                    daoProductos.Log(LogDTO.eAcciones.Baja, "Eliminación de Producto", id, tran);

                    daoProductos.CommitTransaccion(tran);

                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }

        public static string[] GetNombres()
        {
            return daoProductos.GetNombres();
        }

        public static string[] GetNombresComerciales()
        {
            return daoProductos.GetNombresComerciales(); 
        }

        public static string[] GetUnidadesMedida()
        {
            return daoProductos.GetUnidadesMedida();
        }
    }
}
